package com.lucenten.collect.gnss.entity;

import cn.quevo.common.lang.DateFormatUtils;
import cn.quevo.common.lang.NumberUtils;
import com.lucenten.collect.gnss.enums.FileSuffix;
import com.lucenten.collect.gnss.enums.GnssType;
import com.lucenten.collect.utils.FileUtils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GnssFile implements Serializable {

    public final static String DATE_FORMAT = "yyyyMMddHHmmss";
    public final static String REAL_TYPE_TIME = "RT";
    public final static String REAL_TYPE_DEALY = "PP";
    private String sourceFile;                  // 原始ZIP文件
    private String stationId;                   // 站点
    private String stationName;                 // 站点名称
    private String reStationName;               // 崇明后的站点名称
    private String dateStr;                     // yyyyMMddHHmmss(yyyyMMdd000000)
    private LocalDateTime date;                 // 时间
    private Integer year;                       // 年份
    private Integer month;                      // 月份
    private Integer day;                        // 日
    private Integer houre;                      // 小时
    private Integer minute;                     // 分钟
    private Integer dayOfYear;                  // 当年的第几天
    private Path file;                          // 当前操作文件
    private Integer intervalSeconds;            // 文件间隔(s)
    private String[] names;                     // 分割后的文件名称集合
    private String fileName;                    // 文件名称
    private String lowerName;                   // 文件全小写名称
    private FileSuffix fileSuffix;              // 文件后缀
//    private String extPath;                     // 文件存储后缀路径

    private String realType;                    // RT_实时处理,PP_事后处理
    private GnssType gnssType;                  // GNSSTYPE 类型
    private Map<String,SatelliteStation> stations;         // 所有站点信息(key=stationId+","+stationName;value=reStationName)
    private Map<String,SatelliteStation> reStations;       // 重命名后的所有站点信息(key=reStationName)
    private Map<String, SatelliteStation> storageStations;// 需要改名的站点信息
    private List<String> dirFiles;               // 所有文件名称
    private Integer index;
    private String root;
    private SatelliteStation station;
    // 需要清理的文件列表
    private Set<String> clearList;
    // 需要额外备份的文件列表
    private Set<String> backList;

    public GnssFile setFileName(String fileName) {
        this.fileName = fileName;
        this.lowerName = fileName.toLowerCase();
        this.fileSuffix = FileUtils.getFileSuffix(this.lowerName);
        return this;
    }

    public static GnssFile getInstance() {
        GnssFile gnssFile = new GnssFile();
        gnssFile.setStations(new HashMap<>());
        gnssFile.setStorageStations(new HashMap<>());
        gnssFile.setDirFiles(new ArrayList<>());
        gnssFile.setGnssType(GnssType.GNSS);
        gnssFile.setRealType(REAL_TYPE_TIME);
        gnssFile.setClearList(new HashSet<>());
        return gnssFile;
    }

    /**
     * 添加需要清空的文件
     *
     * @param file
     * @return
     */
    public GnssFile addClear(String file) {
        if (this.clearList == null) {
            this.clearList = new HashSet<>();
        }
        this.clearList.add(file);
        return this;
    }

    /**
     * 添加需要备份的文件
     *
     * @param file
     * @return
     */
    public GnssFile addBack(String file) {
        if (this.backList == null) {
            this.backList = new HashSet<>();
        }
        this.backList.add(file);
        return this;
    }

    public boolean isZip(){
        return FileSuffix.ZIP.equals(this.fileSuffix) || FileSuffix.RNX.equals(this.fileSuffix);
    }

    /**
     * 获取原始时间路径
     *
     * @return
     */
    public String getDatePath() {
        return Paths.get(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")), NumberUtils.format(this.getHoure(),"00")).normalize().toString();
    }

    /**
     * 获取重名后时间路径
     *
     * @return
     */
    public String getDayOfYearPath() {
        return Paths.get(this.year.toString(),NumberUtils.format(this.getDayOfYear(),"000"), NumberUtils.format(this.getHoure(),"00")).normalize().toString();
    }

    /**
     * 获取文件类型存储路径
     *
     * @return
     */
    public String getFileTypePath() {
        return this.lowerName.substring(this.lowerName.lastIndexOf("."));
    }
}
